#include "fenetreprincipale.h"
#include "ui_fenetreprincipale.h"

/* ****************************************************************
 *  Constructeur de la fenetre
 * @param parent : objet parent
 * **************************************************************** */
FenetrePrincipale::FenetrePrincipale(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::FenetrePrincipale)
{
    //on utilise l'ui définie
    ui->setupUi(this);


    //On ajoute le widget des lumieres
    wlumiere = new WLumiere();

    //On rajoute au panneau principale notre fenêtre opengl
    _fenetreOGL = new FenetreOpengl(30, this, "Fenetre opengl");
    _scene = new Scene();

    _fenetreOGL->setScene(*_scene);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(_fenetreOGL, 1);

    ui->panneauFenetreOGL->setLayout(layout);
    ui->groupBox_lumieres->layout()->addWidget(wlumiere);

    _fenetreOGL->setFocus();
}

/* ****************************************************************
 * Destructeur de la classe face
 * **************************************************************** */
FenetrePrincipale::~FenetrePrincipale()
{
    delete ui;
    delete wlumiere;
}

//Gestion des évènements de l'interface
void FenetrePrincipale::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

/* ****************************************************************
 * On appuie sur le bouton Nouvelle Scène
 * On crée une nouvelle scène
 * **************************************************************** */
void FenetrePrincipale::on_actionNouvelle_sc_ne_activated()
{
    _fenetreOGL->setScene(*(new Scene()));
}

/* ****************************************************************
 * On appuie sur le bouton Sauvegarder scène
 * **************************************************************** */
void FenetrePrincipale::on_actionSauvegarder_sc_ne_activated()
{
    //On crée le chemin du dossier de sauvegarde
    QString mw_cheminExecutable = QCoreApplication::applicationDirPath();
    QString mw_cheminDossierStockage = mw_cheminExecutable + "/ressources/sauvegarde/";

    //Recuperation du chemin d'accès au fichier image sélectionné
    QString cheminFichier = QFileDialog::getSaveFileName(this, "Choisir une image", mw_cheminDossierStockage, "Scene (*.scene)");
    if(!cheminFichier.isEmpty())
    {
        //Recuperation des informations sur le fichier (nom du fichier + extension)
        QFileInfo informationFichier(cheminFichier);
        QString nomCompletFichier = informationFichier.fileName();

        //Creation du chemin vers lequel on va stocker la scène
        QString cheminStockageScene = mw_cheminDossierStockage + nomCompletFichier + ".scene";

        //Sauvegarde de la scène
        {
            std::ofstream ofs(cheminStockageScene.toAscii().data());
            boost::archive::text_oarchive oa(ofs);
            oa << _scene;
        }
    }
}

/* ****************************************************************
 * On appuie sur le bouton charger scène
 * **************************************************************** */
void FenetrePrincipale::on_actionCharger_sc_ne_activated()
{
    //On crée le chemin du dossier de sauvegarde
    QString mw_cheminExecutable = QCoreApplication::applicationDirPath();
    QString mw_cheminDossierStockage = mw_cheminExecutable + "/ressources/sauvegarde/";

    //Recuperation du chemin d'accès au fichier image sélectionné
    QString cheminFichier = QFileDialog::getOpenFileName(this, "Choisir une image", mw_cheminDossierStockage, "Scene (*.scene)");
    if(!cheminFichier.isEmpty())
    {
        //Recuperation des informations sur le fichier (nom du fichier + extension)
        QFileInfo informationFichier(cheminFichier);
        QString nomCompletFichier = informationFichier.fileName();

        //Creation du chemin vers lequel on va stocker la scène
        QString cheminStockageScene = mw_cheminDossierStockage + nomCompletFichier;

        //Chargement de la scène
        {
            std::ifstream ifs(cheminStockageScene.toAscii().data());
            boost::archive::text_iarchive ia(ifs);
            ia >> _scene;

            _fenetreOGL->setScene(*_scene);
        }

        //On met à jour les lumières
        wlumiere->initialiser();
    }
}

//On clique sur le bouton importer un matériau
void FenetrePrincipale::on_actionImporter_activated()
{
    WMateriau* mat = new WMateriau(this);
    mat->show();
}

void FenetrePrincipale::on_actionImporter_triggered()
{
}
